package com.witmore.skyline.db.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.witmore.skyline.db.entity.DeviceDailyReportDO;
import com.witmore.skyline.db.mapper.dto.ProjectDeviceDetailDTO;
import com.witmore.skyline.db.mapper.dto.ProjectDeviceWorkDaysDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * <p>
 * 设备日报 Mapper 接口
 * </p>
 *
 * @author 豆子高
 * @since 2025-02-24
 */
@Mapper
public interface DeviceDailyReportMapper extends BaseMapper<DeviceDailyReportDO> {

    /**
     * 查询指定时间段内各项目部的设备详细信息（用于去重）
     * @param orgId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 项目部设备详细信息列表
     */
    List<ProjectDeviceDetailDTO> selectProjectDeviceDetailsByDateRange(
        @Param("orgId") Integer orgId,
        @Param("startDate") String startDate,
        @Param("endDate") String endDate
    );

    /**
     * 查询指定时间段内各项目部的施工设备详细信息（负荷工作时间超过阈值，用于去重）
     * @param orgId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param loadWorkTime 负荷工作时间阈值
     * @return 项目部设备详细信息列表
     */
    List<ProjectDeviceDetailDTO> selectProjectDeviceWorkingDetailsByDateRange(
        @Param("orgId") Integer orgId,
        @Param("startDate") String startDate,
        @Param("endDate") String endDate,
        @Param("loadWorkTime") double loadWorkTime
    );

    /**
     * 查询设备当月使用率统计
     * @param orgId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param workTimeThreshold 工作时长阈值（小时）
     * @param category 设备类型（可选）
     * @return 设备当月使用率统计列表
     */
    List<com.witmore.skyline.db.mapper.dto.DeviceMonthlyUsageRateDTO> selectDeviceMonthlyUsageRate(
        @Param("orgId") Integer orgId,
        @Param("startDate") String startDate,
        @Param("endDate") String endDate,
        @Param("workTimeThreshold") Double workTimeThreshold,
        @Param("category") String category
    );

    /**
     * 查询指定时间段内各项目部设备的施工天数统计（用于计算开工率）
     * @param orgId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param loadWorkTime 负荷工作时间阈值
     * @return 项目部设备施工天数统计列表
     */
    List<ProjectDeviceWorkDaysDTO> selectProjectDeviceWorkDaysByDateRange(
        @Param("orgId") Integer orgId,
        @Param("startDate") String startDate,
        @Param("endDate") String endDate,
        @Param("loadWorkTime") double loadWorkTime
    );

}
